package com.guomei.service.curse;

import com.guomei.bean.curse.CountByCourseAndUserIdDTO;
import com.guomei.bean.curse.Course;
import com.guomei.bean.curse.vo.CourseDetail;
import com.guomei.bean.curse.vo.Stats;
import com.guomei.utils.Result;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 课程服务接口
 */
public interface CourseService {
    /**
     * 根据ID查询课程
     * @param id 课程ID
     * @return 课程信息
     */
    Course getById(Long id);

    /**
     * 根据ID查询课程（包含教师信息）
     * @param id 课程ID
     * @return 课程信息（包含教师信息）
     */
    Course getByIdWithTeacher(Long id);

    /**
     * 查询所有课程
     * @return 课程列表
     */
    List<Course> getAll();

    /**
     * 根据条件查询课程
     * @param course 查询条件
     * @return 课程列表
     */
    Result<?> getByCondition(Course course);

    /**
     * 根据条件查询课程（包含教师信息）
     * @param course 查询条件
     * @return 课程列表（包含教师信息）
     */
    Result<?> getByConditionWithTeacher(Course course, HttpServletRequest request);

    /**
     * 新增课程
     * @param course 课程信息
     * @return 新增结果
     */
    Result<?> save(Course course);

    /**
     * 批量新增课程
     * @param courses 课程列表
     * @return 新增结果
     */
    boolean batchSave(List<Course> courses);

    /**
     * 更新课程
     * @param course 课程信息
     * @return 更新结果
     */
    Result<?> update(Course course);

    /**
     * 根据ID删除课程
     * @param id 课程ID
     * @return 删除结果
     */
    boolean removeById(Long id);

    /**
     * 批量删除课程
     * @param ids 课程ID列表
     * @return 删除结果
     */
    boolean batchRemove(List<Long> ids);

    /**
     * 根据分类ID查询课程列表
     * @param categoryId 分类ID
     * @return 课程列表
     */
    List<Course> getByCategoryId(Long categoryId);

    /**
     * 根据分类ID查询课程列表（包含教师信息）
     * @param categoryId 分类ID
     * @return 课程列表（包含教师信息）
     */
    List<Course> getByCategoryIdWithTeacher(Long categoryId);

    /**
     * 根据课程ID查询课程详情
     * @param courseId 课程ID
     * @param request HTTP请求对象（用于获取用户信息）
     * @return 课程详情（包含购买状态和绑定的试卷信息）
     */
    Result<CourseDetail> getCourseDetail(Long courseId, HttpServletRequest request);
    /**
     * 根据用户id和课程id统计数据
     * @param countByCourseAndUserIdDTO
     * @return 课程详情
     */
    Result<?> CountByCourseAndUserId(CountByCourseAndUserIdDTO countByCourseAndUserIdDTO);
    
    /**
     * 获取用户课程学习统计信息
     * @param userId 用户ID
     * @return 包含学习统计信息的用户信息
     */
    Result<Stats> getCourseLearnStats(Long userId);

    Result<?> selectDistributionList(Course  course);

    Result<?> getDataPanel();
    
    /**
     * 分页查询课程列表及统计信息
     * @param queryDTO 查询条件（包含分页参数、课程名称、状态、类型等）
     * @return 课程统计列表（包含分销老师数量、订单数量、销售金额、分销金额）
     */
    Result<?> getCourseListWithStats(com.guomei.bean.curse.dto.CourseStatsQueryDTO queryDTO);
    
    /**
     * 查询分销课程列表（联表查询）
     * 查询所有符合条件的课程，如果课程有该teacherId的分销关系则一起返回，没有则courseDistributerRel为null
     * @param dto 查询条件（包含必传的teacherId用于过滤分销关系、分页参数、可选的课程名称/状态/类型等）
     * @return 分销课程列表（CourseDistribute分页结果）
     */
    
    /**
     * 检查用户是否购买了指定课程列表
     * @param userId 用户ID
     * @param courseIds 课程ID列表
     * @return 与courseIds对应的购买状态数组，公开课返回true
     */
    List<Boolean> checkCoursePurchaseStatus(Long userId, List<Long> courseIds);
    Result<?> getDistributorCourseList(com.guomei.bean.curse.dto.DistributorCourseListDTO dto);
}
